const PdfToImagesConverter = require('../utils/PdfToImages');

/**
 * 从PDF中提取图片的IPC处理函数
 * @param {Electron.IpcMainInvokeEvent} event - IPC事件对象
 * @param {Object} config - 转换配置
 * @param {string|string[]} config.pdfPaths - PDF文件路径，可以是单个路径或路径数组
 * @param {string} config.outputDir - 图片输出目录
 * @param {string} config.outputFormat - 图片输出格式
 * @param {number} config.outputQuality - 图片输出质量
 * @param {number} config.width - 图片宽度
 * @param {number} config.height - 图片高度
 * @param {string} config.filePrefix - 文件名前缀
 * @param {boolean} config.isMultipleFiles - 是否为多个PDF文件
 * @param {string} config.convertType - 转换类型：'convertPages' 或 'extractRawImages'，默认'extractRawImages'
 * @param {Electron.BrowserWindow} mainWindow - 主窗口对象
 * @returns {Promise<Object>} - 转换结果
 */
async function pdfToImagesFn(event, config, mainWindow) {
  try {
    // 创建PDF转图片转换器实例
    console.log('PDF转图片处理开始，配置:', JSON.stringify(config, null, 2));

    // 尝试序列化config对象
    try {
      JSON.stringify(config);
      console.log('config对象是可序列化的');
    } catch (error) {
      console.error('config对象不可序列化:', error);
      return {
        success: false,
        message: '配置对象不可序列化',
        results: []
      };
    }

    const converter = new PdfToImagesConverter(config);

    // 执行转换
    let result;
    try {
      // 从config中获取转换类型，默认使用'extractRawImages'
      const convertType = config.convertType || 'extractRawImages';
      
      if (convertType === 'extractRawImages') {
        result = await converter.extractRawImagesFn(mainWindow);
        console.log('提取原始图片成功，结果:', JSON.stringify(result, null, 2));
      } else {
        result = await converter.convertFn(mainWindow);
        console.log('转换PDF页面成功，结果:', JSON.stringify(result, null, 2));
      }
    } catch (error) {
      console.error('转换过程中发生错误:', error);
      console.error('错误详情:', error.stack);
      // 确保错误对象是可序列化的
      throw new Error(error.message || '转换过程中发生未知错误');
    }

    // 确保返回值只包含可序列化的数据
    const returnValue = {
      success: result.success,
      message: result.message,
      results: result.results || []
    };

    // 检查结果数组中的每个对象是否可序列化
    if (returnValue.results && returnValue.results.length > 0) {
      for (let i = 0; i < returnValue.results.length; i++) {
        const resultItem = returnValue.results[i];
        try {
          JSON.stringify(resultItem);
          console.log(`结果项 ${i} 是可序列化的`);
        } catch (error) {
          console.error(`结果项 ${i} 不可序列化:`, error);
          console.error(`结果项 ${i} 内容:`, resultItem);
          // 移除不可序列化的结果项
          returnValue.results.splice(i, 1);
          i--;
        }
      }
    }

    // 尝试序列化返回值
    try {
      JSON.stringify(returnValue);
      console.log('返回值是可序列化的');
    } catch (error) {
      console.error('返回值不可序列化:', error);
      // 简化返回值，确保它是可序列化的
      return {
        success: false,
        message: '返回结果不可序列化，已简化返回值',
        results: []
      };
    }

    return returnValue;
  } catch (error) {
    console.error('PDF转图片IPC处理函数执行失败:', error);
    console.error('错误详情:', error.stack);
    // 返回可序列化的错误对象
    return {
      success: false,
      message: 'PDF转图片失败: ' + error.message,
      results: []
    };
  }
}

module.exports = { pdfToImagesFn };
